#ifndef __T_ELEMLISTAMENSAJES__
#define __T_ELEMLISTAMENSAJES__

#include "TMensaje.h"
#include "TPila.h"
#include "TCola.h"

#define NLM_OK 0
#define NLM_ERR_MEMORIA 1
#define NLM_ERR_NOHAYMENSAJES 2

typedef struct {
	int puerto;
	TPila* mensajes_prioritarios;
	TCola* mensajes_no_prioritarios;
	int tam_elemento;	
} TElemListaMensajes;

/**
 * Asigna recursos para TElemListaMensajes y lo deja listo para su utilizacion
 * @param TElemListaMensajes* elemento es el elemento a crear
 * @param TPuerto puerto es el numero de puerto
 * @param int tam_elemento es el tamanio del elemento a almacenar
 * @autor 
 * @pre   elem no esta creado pero tiene suficiente memoria alocada
 * @post  elem esta creado y listo para almacenar mensajes
 */
int TNLM_Crear(TElemListaMensajes* elemento, TPuerto puerto, int tam_elemento);

/**
 * Libera recursos de un TElemListaMensajes
 * @param TElemListaMensajes elemento es el elemento de la lista a destruir
 * @autor 
 * @pre   elemento es un TElemListaMensajes previamente creado
 * @post  elemento libero todos los recursos que utilizaba
 */
int TNLM_Destruir(TElemListaMensajes* elemento);

/**
 * Devuelve el numero de puerto asignado a este elemento
 * @param  TElemListaMensajes elemento es el elemento del cual se quiere obtener el puerto
 * @autor 
 * @pre    elemento esta creado
 * @post   La estructura de elemento no se altera
 * @return Un int que representa el numero de puerto de elemento (se puede castear a TPuerto)
 */
int TNLM_ObtenerPuerto(TElemListaMensajes* elemento);

/**
 * Almacena un TMensaje dentro de la estructura de elemento y lo categoriza como 'prioritario'
 * @param TElemListaMensajes* elemento apunta al elemento al cual se le va a agregar el mensaje
 * @param TMensaje* mensaje_in es el mensaje que se almacenara
 * @autor 
 * @pre   elemento y mensaje_in estan creados
 * @post  mensaje_in no se altera; elemento almacena una copia de mensaje_in
 * @return
 */
int TNLM_InsertarMensajePrioritario(TElemListaMensajes* elemento, TMensaje* mensaje_in);

/**
 * Almacena un TMensaje dentro de la estructura de elemento y lo categoriza como 'no prioritario'
 * @param TElemListaMensajes* elemento apunta al elemento al cual se le va a agregar el mensaje
 * @param TMensaje* mensaje_in es el mensaje que se almacenara
 * @autor 
 * @pre   elemento y mensaje_in estan creados
 * @post  mensaje_in no se altera; elemento almacena una copia de mensaje_in
 * @return
 */
int TNLM_InsertarMensajeNoPrioritario(TElemListaMensajes* elemento, TMensaje* mensaje_in);

/**
 * Obtiene un mensaje categorizado como 'prioritario'
 * @param TElemListaMensajes* elemento es el elemento del cual se obtendra el mensaje
 * @param TMensaje* mensaje_out es la variable donde se almacenara el mensaje saliente
 * @autor 
 * @pre   elemento esta creado, mensaje_out debe tener suficiente memoria alocada, si esta creado se destruira
 * @post  elemento deja de tener el mensaje que se extrajo y mensaje_out contiene el mensaje que se extrajo
 */
int TNLM_ObtenerMensajePrioritario(TElemListaMensajes* elemento, TMensaje* mensaje_out);

/**
 * Obtiene un mensaje categorizado como 'no prioritario'
 * @param TElemListaMensajes* elemento es el elemento del cual se obtendra el mensaje
 * @param TMensaje* mensaje_out es la variable donde se almacenara el mensaje saliente
 * @autor 
 * @pre   elemento esta creado, mensaje_out debe tener suficiente memoria alocada, si esta creado se destruira
 * @post  elemento deja de tener el mensaje que se extrajo y mensaje_out contiene el mensaje que se extrajo
 */
int TNLM_ObtenerMensajeNoPrioritario(TElemListaMensajes* nodo, TMensaje* mensaje_out);

#endif
